'''
Created on 28/10/2012

@author: Raphoka
'''
# -*- coding: cp1252 -*-
import MySQLdb as mdb
from Persistencia.CriarTabelas import CriarTabelas
from Controle.Funcionario import Funcionario
from Controle.Cargo import Cargo


class FuncionarioDao(object):
    '''
    classdocs
    '''


    def __init__(self):
        '''
        Constructor
        '''
        self.conexao = CriarTabelas() 
        self.__host = self.conexao._CriarTabelas__host
        self.__schema = self.conexao._CriarTabelas__schema
        self.__usuario = self.conexao._CriarTabelas__usuario
        self.__port = self.conexao._CriarTabelas__port
        self.__senha = self.conexao._CriarTabelas__senha

#===============================================================================
# Remove todos os Cargos    
#===============================================================================
    def removerCargos(self, removerCargos):
        comandosSQL = []
        for i in removerCargos:
            sql1 = '''
DELETE FROM car_cargo WHERE car_id = '%s' 
'''%(i.getId())

            comandosSQL.append(sql1)
        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)                
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)
            db.commit()
            
            cursor.close()
            return True
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return False



    
    def cadastrarCargos(self, novaListaCargos):
        comandosSQL = []
        for i in novaListaCargos:
            
            descricao = i.getDescricao()
        
            sql1 = '''
INSERT INTO car_cargo (car_descricao) values ('%s')
'''%(descricao)
        
            comandosSQL.append(sql1)
        
        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)                
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)
            db.commit()
            
            cursor.close()
            return True
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return False

    
    def pesquisarCargos(self):
        sql1 = '''
SELECT * FROM car_cargo order by car_descricao 
'''
        comandosSQL = [sql1]

        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)

            dados = cursor.fetchall()
            cursor.close()
            return self.__criarObjetosCargo__(dados)
        except mdb.Error, e:
            print "Error %d: %s" % (e.args[0], e.args[1])
            return self.__criarObjetosCargo__(dados)
        
    def pesquisarCargo(self, Id):
        sql1 = '''
SELECT * FROM car_cargo WHERE car_id = '%s' 
'''%(Id)
        comandosSQL = [sql1]

        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)

            dados = cursor.fetchall()
            cursor.close()
            
            return self.__criarObjetosCargo__(dados)
        except mdb.Error, e:
            print "Error %d: %s" % (e.args[0], e.args[1])
            return self.__criarObjetosCargo__(dados)
        
    def __criarObjetosCargo__(self, dados):
        cargos = []
        
        for i in dados:
            
            Id = (i[0])
            descricao = str(i[1])

            cargo = Cargo()
            cargo.setId(Id)
            cargo.setDescricao(descricao)
            
            cargos.append(cargo)
            
        return cargos

    
    def pesquisarFuncionario(self, keyword, field):
        sql1 = '''
SELECT * FROM fun_funcionario WHERE %s LIKE '%s'
'''%(field, keyword)

        comandosSQL = [sql1]

        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema, charset="utf8", use_unicode = True)
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)

            dados = cursor.fetchall()
            cursor.close()
            
            funcionario = self.__criarObjetosFuncionario__(dados)
            return funcionario
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return None

    def __criarObjetosFuncionario__(self, dados):
        ListaFuncionarios = []
        
        for i in dados:
            Id = str(i[0])
            nome = (i[1])
            cpf = i[2]
            email = i[3]
            login = i[4]
            senha = i[5]
            isAdm = i[6]
            if i[7] <> None:
                cargo = self.pesquisarCargo(i[7])[0]
            else:
                cargo = None
            ativo = i[8]
            
            fun = Funcionario()
            fun.setId(Id)
            fun.setNome(nome)
            fun.setCPF(cpf)
            fun.setEmail(email) 
            fun.setLogin(login)
            fun.setSenha(senha)
            fun.setAdm(isAdm)
            fun.setCargo(cargo)
            fun.setAtivo(ativo)
            
            ListaFuncionarios.append(fun)
            
        return ListaFuncionarios

    
    def cadastrarFuncionario(self, fun):
        nome = fun.getNome()
        cpf = fun.getCPF()
        email = fun.getEmail()
        login = fun.getLogin()
        senha= fun.getSenha()
        adm = fun.isAdm()
        cargoId = fun.getCargo().getId()
        ativo = fun.getAtivo()
        
        
        sql1 = '''
INSERT INTO fun_funcionario (fun_nome, fun_cpf, fun_email, fun_login, fun_senha, fun_administrador, fun_cargo, fun_ativo)
VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')
''' %(nome, cpf, email, login, senha, adm, cargoId, ativo)

        comandosSQL = [sql1]
        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)               
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)
            db.commit()
            
            cursor.close()
            return True
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return False

    
    def pesquisarFuncionarios(self, keyword, field):
        keyword = "%"+keyword+"%"
        sql1 = '''
SELECT * FROM fun_funcionario WHERE %s LIKE '%s'
'''%(field, keyword)

        comandosSQL = [sql1]

        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema, charset="utf8", use_unicode = True)
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)

            dados = cursor.fetchall()
            cursor.close()
            
            
            funcionarios = self.__criarObjetosFuncionario__(dados)
            return funcionarios
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return None

    
    def removerFuncionario(self, funcionario):
        Id = funcionario.getId()
        sql1 = '''
UPDATE fun_funcionario SET fun_ativo = '0' WHERE fun_id = '%s'        
'''%(Id)
        
        comandosSQL = [sql1]
        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)               
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)
            db.commit()
            
            cursor.close()
            return True
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return False

    
    def editarFuncionario(self, funcionarioAEditar):
        Id = funcionarioAEditar.getId()
        nome = funcionarioAEditar.getNome()
        cpf = funcionarioAEditar.getCPF()
        email = funcionarioAEditar.getEmail()
        login = funcionarioAEditar.getLogin()
        senha = funcionarioAEditar.getSenha()
        isAdm = funcionarioAEditar.isAdm()
        cargoId = funcionarioAEditar.getCargo().getId()
        ativo = funcionarioAEditar.getAtivo()
        
        sql1 = '''
UPDATE fun_funcionario SET fun_nome = '%s', fun_cpf = '%s', fun_email = '%s', fun_login = '%s', 
fun_senha = '%s', fun_administrador = '%s', fun_cargo = '%s', fun_ativo = '%s' WHERE fun_id = '%s'        
'''%(nome, cpf, email, login, senha, isAdm, cargoId, ativo, Id)
        
        comandosSQL = [sql1]
        
        db = mdb.connect(host=self.__host, port=self.__port, user=self.__usuario, passwd=self.__senha, db=self.__schema)               
            
        cursor = db.cursor()
        try:
            for i in comandosSQL:
                cursor.execute(i)
            db.commit()
            
            cursor.close()
            return True
        except mdb.Error, e:
            db.rollback()
            cursor.close()
            print "Error %d: %s" % (e.args[0], e.args[1])
            return False

    
    
